home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Common / Graphics / Headers / PixPort.h next >
C/C++ Source or Header  |  1999-08-07  |  8KB  |  220 lines

  1. #pragma once
  2.  
  3. #if EG_WIN
  4.  
  5. // ### in your global header, define USE_DIRECTX 1 if you want full screeen ability!!!
  6. #if USE_DIRECTX
  7. #include <ddraw.h>
  8. #else
  9. typedef long LPDIRECTDRAW;
  10. typedef long LPDIRECTDRAWSURFACE;
  11. #endif
  12.  
  13. #endif
  14.  
  15.  
  16.  
  17. #if EG_MAC
  18.  
  19. // ### in your global header, define USE_DRAW_SPROCKETS 1 if you want full screeen ability!!!
  20. #include <QuickDraw.h>
  21. #include <QDOffscreen.h>
  22.  
  23. #if USE_DRAW_SPROCKETS
  24. #include <DrawSprocket.h>
  25. #else
  26. typedef long DSpContextReference;
  27. struct DSpContextAttributes    { };
  28. #endif
  29. #else
  30. #endif
  31.  
  32. #include "UtilStr.h"
  33.  
  34.  
  35.  
  36.  
  37. #define __Clr8(r,g,b)    0
  38. #define __Clr16(r,g,b)    ((( ((unsigned long) r) & 0xF800) >> 1) | ((((unsigned long) g) & 0xF800) >> 6) | (((unsigned long) b) >> 11))
  39. #if EG_MAC 
  40. #define    __Clr32(r,g,b)    (((r & 0xFF00) << 8) | (g & 0xFF00) | (b >> 8))
  41. #elif EG_WIN
  42. #define    __Clr32(r,g,b)    __winRGB( r, g, b )
  43. #endif
  44.  
  45. #define __ClrREF( rgb ) __Clr32( rgb.red, rgb.green, rgb.blue )
  46.  
  47.  
  48.  
  49. /*  PixPort is a platform indep drawing world/environment.  You set the size of one using
  50. Init() and then execute whatever drawing commands. When the drawing is complete, CopyBits() 
  51. copies pixel data from this world to the given destination OS graphics world.  */
  52.     
  53.  
  54.  
  55.  
  56. /* 
  57.     This class wraps around Apple's GameSprokets suite, DrawSprokets.  It implements page 
  58. flipping whenever possible, allowing for very high performance grafx.  To use it, make 
  59. an instance of CDrawSproket at the start of your prog, call TryInit(), then Activate()
  60. and you're all set via SwapBuffers().  When you're done using the display, you must call
  61. Deactivate() to give the display back to the OS for normal use.
  62. */
  63.  
  64. class PixPort {
  65.  
  66.  
  67.     public:
  68.     
  69.         friend class PixPort;
  70.                                  PixPort();
  71.         virtual                    ~PixPort();
  72.  
  73.         // These *must* be called once at the start and end of the program respectively.
  74.         // Otherwise DrawSprokets never get initialized--and that's very bad.
  75.         //    If Startup() returns false, it means fullscreen is not available!!
  76.         static void                Startup();
  77.         static void                Shutdown();
  78.  
  79.         // Util fcn that returns the display number of the given mouse point in global cords.
  80.         // If 0 is returned if the call failed.  Use the number returned here for InitFullscreen()
  81.         static long                GetOwningDisplay( const Point& inPt );
  82.         
  83.         // Returns true if PixPorts are able to take over a screen
  84.         static bool                FullscreenAvail()                            { return sCanFullscreen;    }
  85.  
  86.         // One or the other must be called before a PixPort is used.  If inDepth is 0 or invalid,
  87.         // the current OS depth is used.  Call Deactivate() or Init() to exit fullscreen mode.
  88.         // inWin is passed because PixPort may need the window that's going fullscreen
  89.         void                    Init( int inWidth, int inHeight, int inDepth = 0 );
  90.         bool                    InitFullscreen( int inDispNum, Point& outSize, WindowPtr inWin, int inBitDepth = 0  );
  91.     
  92.         // Returns true if currently in fullscreen mode (ie, InitFullscreen() returned true)
  93.         inline bool                IsFullscreen() const                        { return mContextRef != 0; }
  94.             
  95.         //    Politely returns the activated display to it's normal state before Activate();
  96.         void                    Deactivate();
  97.  
  98.         // Returns the current bit color depth from Init(). (8, 16, or 32)
  99.         long                    GetDepth()                                            { return mBytesPerPix * 8;     }
  100.     
  101.         //    Sets the background colors (for erase rect and Blur() )
  102.         //  Returns the new pixel entry for the given color and this port
  103.         long                    SetBackColor( const RGBColor& inColor );
  104.         long                    SetBackColor( long inR, long inG, long inB );
  105.  
  106.         //    Be sure this is called before and after *any* of the following calls
  107.         void                    BeginFrame();
  108.         void                    EndFrame();
  109.  
  110.         //    Blurs the rect given in this image, with a given box filter of size (1=no blur)
  111.         //    If the dest is NULL, the blur is applied to itself
  112.         void                    GaussBlur( int inBoxWidth, const Rect& inRect, void* inDestBits = NULL );    
  113.         
  114.         //    A different, more primitive blur that doesn't look as good as GaussBlur,
  115.         void                    CrossBlur( const Rect& inRect );
  116.  
  117.         //     Sets the width of the pen
  118.         void                    SetLineWidth( long inWidth );
  119.         
  120.         //    Draw a line.  Use GetPortColor() to get a device color for a RGB
  121.         void                    Line( int sx, int sy, int ex, int ey, long inColor );
  122.         void                    Line( int sx, int sy, int ex, int ey, const RGBColor& inS, const RGBColor& inE );
  123.  
  124.         inline long                GetPortColor_inline( long inR, long inG, long inB ) {
  125.             if ( mBytesPerPix == 2 )
  126.                 return __Clr16( inR, inG, inB );
  127.             else if ( mBytesPerPix == 4 ) 
  128.                 return __Clr32( inR, inG, inB );
  129.             else
  130.                 return __Clr8( inR, inG, inB );
  131.         }
  132.         
  133.         //    Set the given rect to the current background color.  If no rect is specified, the entire port rect is cleared.
  134.         void                    EraseRect( const Rect* inRect = NULL );
  135.         
  136.         //    Copies the pixels in a rectangle from this image to the destination
  137.         void                    CopyBits( WindowPtr inDest, const Rect* inSrcRect, const Rect* inDestRect );
  138.  
  139.                 
  140.         //    Gets a port/device color for a given RGB        
  141.         long                    GetPortColor( long inR, long inG, long inB );
  142.         inline long                GetPortColor( const RGBColor& inColor )          { return GetPortColor( inColor.red, inColor.green, inColor.blue );  }
  143.     
  144.         //    The guts for G-Force...  This PixPort must be in 8-bit mode to do anything.
  145.         void                    Fade( PixPort& ioDest, char* inGrad );
  146.         
  147.         // When in fullscreen, use this (on mac) to declare what's area needs to be updated on screen
  148.         void                    UnionDirtyRect( const Rect* inDirtyRect );
  149.                 
  150.         //    When this sprocket is set to 256 colors, you may change the palette it's using any time
  151.         //    Pre: inColors[].rgb is the RGB of palette entry i.
  152.         //    Post:  The current palette is set to inColors[]
  153.         //void                    SetPalette( ColorSpec inColors[ 256 ] );
  154.  
  155.         long                    GetX()            { return mX; }
  156.         long                    GetY()            { return mY; }
  157.                 
  158.         static long                sMinDepth;
  159.         static long                sOSDepth;
  160.  
  161.         
  162.         #define MAX_LINE_WIDTH        32
  163.     
  164.         
  165.     protected:
  166.  
  167.         static long                sCanFullscreen;
  168.     
  169.         long                    mBytesPerPix;
  170.         long                    mBytesPerRow;
  171.         long                    mX, mY;
  172.         long                    mBackColor;
  173.         long                    mLineWidth;
  174.         UtilStr                    mTempBuf;
  175.         
  176.         char*                    mBits;
  177.         
  178.         PixMapHandle            mBM;
  179.         GWorldPtr                mWorld;
  180.         
  181.         #if EG_WIN
  182.         BITMAPINFO                mInfo;
  183.         LPDIRECTDRAWSURFACE        mContextRef;
  184.         LPDIRECTDRAW            mDDObj;
  185.         #endif
  186.         
  187.         #if EG_MAC
  188.         char**                    mTempHndl;
  189.         long                    mHndlSize;
  190.         DSpContextReference        mContextRef;
  191.         DSpContextAttributes    mContext;
  192.         #endif
  193.         
  194.         
  195.         void                    EraseRect8 ( const Rect* inRect );
  196.         void                    EraseRect16( const Rect* inRect );
  197.         void                    EraseRect32( const Rect* inRect );
  198.  
  199.  
  200.         static void                BoxBlur8 ( char* inSrce, char* inDest, int inBoxWidth, int inWidth, int inHeight, int inSrceRowSize, int inDestRowSize, unsigned long* temp, unsigned long inBackColor ); 
  201.         static void                BoxBlur16( char* inSrce, char* inDest, int inBoxWidth, int inWidth, int inHeight, int inSrceRowSize, int inDestRowSize, unsigned long* temp, unsigned long inBackColor ); 
  202.         static void                BoxBlur32( char* inSrce, char* inDest, int inBoxWidth, int inWidth, int inHeight, int inSrceRowSize, int inDestRowSize, unsigned long* temp, unsigned long inBackColor ); 
  203.  
  204.         static void                CrossBlur8 ( char* inSrce, int inWidth, int inHeight, int inBytesPerRow, unsigned char* inRowBuf );
  205.         static void                CrossBlur16( char* inSrce, int inWidth, int inHeight, int inBytesPerRow, unsigned char* inRowBuf );
  206.         static void                CrossBlur32( char* inSrce, int inWidth, int inHeight, int inBytesPerRow, unsigned char* inRowBuf );
  207.  
  208.         void                    Line8 ( int sx, int sy, int ex, int ey, long inColor );
  209.         void                    Line16( int sx, int sy, int ex, int ey, long inColor );
  210.         void                    Line32( int sx, int sy, int ex, int ey, long inColor );
  211.  
  212.  
  213.         void                    Line8 ( int sx, int sy, int ex, int ey, const RGBColor& inS, long dR, long dG, long dB );
  214.         void                    Line16( int sx, int sy, int ex, int ey, const RGBColor& inS, long dR, long dG, long dB );
  215.         void                    Line32( int sx, int sy, int ex, int ey, const RGBColor& inS, long dR, long dG, long dB );
  216.  
  217.  
  218.         //static void                movePt( int& ioX, int& ioY, int inDx, int inDy, int inDist );
  219.  
  220. };